package br.com.foxinline.manager.criar;

import br.com.foxinline.enums.*;
import br.com.foxinline.modelo.*;
import br.com.foxinline.servico.BairroServico;
import br.com.foxinline.servico.BancoServico;
import br.com.foxinline.servico.CidadeServico;
import br.com.foxinline.servico.FirmaServico;
import br.com.foxinline.servico.PessoaServico;
import br.com.foxinline.servico.UsuarioServico;
import br.com.foxinline.utilitario.AnexoUtilitario;
import br.com.foxinline.utilitario.Caracteres;
import br.com.foxinline.utilitario.Mensagem;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Serializable;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.primefaces.context.RequestContext;
import org.primefaces.event.CaptureEvent;
import org.primefaces.event.FileUploadEvent;

/**
 *
 * @author cadomeireles
 */
@ViewScoped
@ManagedBean
public class ManagerCriarPessoa implements Serializable {

    @EJB
    PessoaServico pessoaServico;
    @EJB
    CidadeServico cidadeServico;
    @EJB
    BancoServico bancoServico;
    @EJB
    FirmaServico firmaServico;
    @EJB
    UsuarioServico usuarioServico;
    @EJB
    BairroServico bairroServico;
    private Pessoa pessoa;
    private String editarId;
    private ContaBancaria contaBancaria;
    private ContaBancaria contaBancariaDeletar;
    private List<ContaBancaria> contasBancarias;
    /**
     * Foto
     */
    private Anexo imagem;
    /**
     * Abertura de Firma
     */
    private Firma firma;
    private List<Anexo> fichasAssinatura;
    private List<Anexo> anexos;
    private AnexoUtilitario arquivoUtilitario;
    private Pessoa depositantePesquisar;
    private Pessoa depositanteSelecionado;
    private List<Pessoa> listDepositante;

    private Telefone telefone;
    private Telefone telefoneDeletar;

    @PostConstruct
    public void init() {
        instanciar();
        delegar();
    }

    private void instanciar() {
        this.pessoa = new Pessoa();
        this.pessoa.setTipoPessoa(TipoPessoa.FISICA);
        this.pessoa.setEndereco(new Endereco());
        this.contasBancarias = new ArrayList<ContaBancaria>();
        this.fichasAssinatura = new ArrayList<Anexo>();
        this.arquivoUtilitario = new AnexoUtilitario();
        this.anexos = new ArrayList<Anexo>();
        this.firma = new Firma();
        instanciarContaBancaria();
        instanciarDepositantePesquisar();
        instanciarTelefone();
    }

    public void instanciarDepositantePesquisar() {
        this.depositantePesquisar = new Pessoa();
        this.depositantePesquisar.setTipoPessoa(TipoPessoa.FISICA);

        this.depositanteSelecionado = new Pessoa();

        this.listDepositante = new ArrayList<Pessoa>();
    }

    private void instanciarContaBancaria() {
        this.contaBancaria = new ContaBancaria();
        this.contaBancariaDeletar = new ContaBancaria();
    }

    private void instanciarTelefone() {
        this.telefone = new Telefone();
        this.pessoa.setTelefones(new ArrayList<Telefone>());
    }

    private void delegar() {
        Map<String, String> parametros = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
        this.editarId = parametros.get("pessoaId");

        if (this.editarId != null) {
            this.pessoa = pessoaServico.pesquisar(Long.valueOf(this.editarId));
            this.contasBancarias = pessoaServico.obterContasBancarias(this.pessoa);
        }
    }

    public void salvarCliente() {
        this.pessoa.setCategoriaPessoa(CategoriaPessoa.CLIENTE);

        if (this.pessoa.getTipoPessoa() == TipoPessoa.FISICA) {
            this.pessoa.setCpf(Caracteres.removecaracter(this.pessoa.getCpf()));
        } else {
            this.pessoa.setCnpj(Caracteres.removecaracter(this.pessoa.getCnpj()));
        }

        this.pessoa.setContasBancarias(contasBancarias);

        salvar("Cliente");
    }

    public void salvarClienteFirma() {


        this.pessoa.setCategoriaPessoa(CategoriaPessoa.CLIENTE);

        if (this.pessoa.getTipoPessoa() == TipoPessoa.FISICA) {
            this.pessoa.setCpf(Caracteres.removecaracter(this.pessoa.getCpf()));
        } else {
            this.pessoa.setCnpj(Caracteres.removecaracter(this.pessoa.getCnpj()));
        }

        this.pessoa.setContasBancarias(contasBancarias);
        
        //SALVA OU ATUALIZA PESSOA
        salvar(null);

        //SALVA ANEXOS
        // adicionar anexos
        if (this.anexos != null && !this.anexos.isEmpty()) {
            try {
                this.firma.setAnexos(anexos);
                arquivoUtilitario.gravarAnexos(this.firma.getAnexos());
            } catch (IOException ex) {
                Logger.getLogger(ManagerCriarPessoa.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        // adicionar fichas
        if (this.fichasAssinatura != null && !this.fichasAssinatura.isEmpty()) {
            try {
                this.firma.setFichasAssinatura(fichasAssinatura);
                arquivoUtilitario.gravarAnexos(this.firma.getFichasAssinatura());
            } catch (IOException ex) {
                Logger.getLogger(ManagerCriarPessoa.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        //SALVA FIRMA
        try {
            this.firma.setPessoa(this.pessoa);
            //TODO capturar usuário logado
            this.firma.setCriadoPor(null);
            this.firmaServico.salvar(this.firma);
            Mensagem.messagemInfo("Firma salva com sucesso");
        } catch (Exception e) {
            e.printStackTrace();
            Mensagem.messagemError();
        }
    }

    public void salvarFornecedor() {
        this.pessoa.setCategoriaPessoa(CategoriaPessoa.FORNECEDOR);
        this.pessoa.setTipoPessoa(TipoPessoa.JURIDICA);
        this.pessoa.setCnpj(Caracteres.removecaracter(this.pessoa.getCnpj()));

        salvar("Fornecedor");
    }

    private void salvar(String mensagem) {
        this.pessoa.getEndereco().setCep(Caracteres.removecaracter(this.pessoa.getEndereco().getCep()));

        if (this.pessoa.getId() == null) {
            pessoaServico.salvar(this.pessoa);
            instanciar();
            if (mensagem != null) {
                mensagem += " cadastrado com sucesso!";
            }
        } else {
            pessoaServico.atualizar(this.pessoa);
            if (mensagem != null) {
                mensagem += " atualizado com sucesso!";
            }
        }

        if (mensagem != null) {
            Mensagem.messagemInfo(mensagem);
        }
    }

    public void adicionarContaBancaria() {
        this.contasBancarias.add(this.contaBancaria);
        instanciarContaBancaria();
    }

    public void editarContaBancaria(ContaBancaria conta) {
        this.contaBancaria = conta;
        this.contaBancariaDeletar = conta;
        removerContaBancaria();
    }

    public void removerContaBancaria() {
        this.contasBancarias.remove(this.contaBancariaDeletar);
    }

    public void adicionarTelefone() {
        this.pessoa.getTelefones().add(this.telefone);
        this.telefone = new Telefone();
    }
    
    public void limparTelefone() {
        this.telefone = new Telefone();
    }
    
    public void editarTelefone(Telefone telefone) {
        this.telefone = telefone;
        this.telefoneDeletar = telefone;
        removerTelefone();
    }

    public void removerTelefone() {
        this.pessoa.getTelefones().remove(this.telefoneDeletar);
    }
    
    public List<Banco> autocompleteBanco(String str) {
        return bancoServico.autocomplete(str);
    }

    public List<Cidade> autocompletarCidade(String query) {
        return cidadeServico.autocompletar(query);
    }

    public List<Bairro> autocompletarBairro(String query) {
        return bairroServico.autocompletar(query, this.pessoa.getEndereco().getCidade());
    }

    public Pessoa getPessoa() {
        return pessoa;
    }

    public void setPessoa(Pessoa pessoa) {
        this.pessoa = pessoa;
    }

    public String getEditarId() {
        return editarId;
    }

    public void setEditarId(String editarId) {
        this.editarId = editarId;
    }

    public List<ContaBancaria> getContasBancarias() {
        return contasBancarias;
    }

    public void setContasBancarias(List<ContaBancaria> contasBancarias) {
        this.contasBancarias = contasBancarias;
    }

    public ContaBancaria getContaBancaria() {
        return contaBancaria;
    }

    public void setContaBancaria(ContaBancaria contaBancaria) {
        this.contaBancaria = contaBancaria;
    }

    public Firma getFirma() {
        return firma;
    }

    public void setFirma(Firma firma) {
        this.firma = firma;
    }

    public List<Anexo> getAnexos() {
        return anexos;
    }

    public void setAnexos(List<Anexo> anexos) {
        this.anexos = anexos;
    }

    public List<Anexo> getFichasAssinatura() {
        return fichasAssinatura;
    }

    public void setFichasAssinatura(List<Anexo> fichasAssinatura) {
        this.fichasAssinatura = fichasAssinatura;
    }

    public Pessoa getDepositantePesquisar() {
        return depositantePesquisar;
    }

    public void setDepositantePesquisar(Pessoa depositantePesquisar) {
        this.depositantePesquisar = depositantePesquisar;
    }

    public Pessoa getDepositanteSelecionado() {
        return depositanteSelecionado;
    }

    public void setDepositanteSelecionado(Pessoa depositanteSelecionado) {
        this.depositanteSelecionado = depositanteSelecionado;
    }

    public List<Pessoa> getListDepositante() {
        return listDepositante;
    }

    public void setListDepositante(List<Pessoa> listDepositante) {
        this.listDepositante = listDepositante;
    }

    public Anexo getImagem() {
        return imagem;
    }

    public void setImagem(Anexo imagem) {
        this.imagem = imagem;
    }

    public ContaBancaria getContaBancariaDeletar() {
        return contaBancariaDeletar;
    }

    public void setContaBancariaDeletar(ContaBancaria contaBancariaDeletar) {
        this.contaBancariaDeletar = contaBancariaDeletar;
    }

    public Telefone getTelefone() {
        return telefone;
    }

    public void setTelefone(Telefone telefone) {
        this.telefone = telefone;
    }

    public Telefone getTelefoneDeletar() {
        return telefoneDeletar;
    }

    public void setTelefoneDeletar(Telefone telefoneDeletar) {
        this.telefoneDeletar = telefoneDeletar;
    }

    public void adicionarFichas(FileUploadEvent event) {

        try {
            this.fichasAssinatura.add(arquivoUtilitario.adicionarArquivo(event));
        } catch (FileNotFoundException e) {
            Logger.getLogger(ManagerCriarImovel.class.getName()).log(Level.SEVERE, null, e);
        } catch (SQLException e) {
            Logger.getLogger(ManagerCriarImovel.class.getName()).log(Level.SEVERE, null, e);
        } catch (IOException e) {
            Logger.getLogger(ManagerCriarImovel.class.getName()).log(Level.SEVERE, null, e);
        }

    }

    public void removerFichas(Anexo a) {
        try {
            arquivoUtilitario.excluirArquivo(new File(a.getUrl() + a.getNome()));
            this.fichasAssinatura.remove(a);
        } catch (FileNotFoundException ex) {
            Logger.getLogger(ManagerCriarImovel.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void removerAnexo(Anexo a) {
        try {
            arquivoUtilitario.excluirArquivo(new File(a.getUrl() + a.getNome()));
            this.anexos.remove(a);
        } catch (FileNotFoundException ex) {
            Logger.getLogger(ManagerCriarImovel.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void adicionarAnexos(FileUploadEvent event) {

        try {
            this.anexos.add(arquivoUtilitario.adicionarArquivo(event));
        } catch (FileNotFoundException e) {
            Logger.getLogger(ManagerCriarImovel.class.getName()).log(Level.SEVERE, null, e);
        } catch (SQLException e) {
            Logger.getLogger(ManagerCriarImovel.class.getName()).log(Level.SEVERE, null, e);
        } catch (IOException e) {
            Logger.getLogger(ManagerCriarImovel.class.getName()).log(Level.SEVERE, null, e);
        }

    }

    public void pesquisarDepositante() {
        this.listDepositante = pessoaServico.pesquisarCliente(this.depositantePesquisar);
    }

    public void selecionarDepositante() {
        this.pessoa = this.depositanteSelecionado;

        RequestContext requestContext = RequestContext.getCurrentInstance();
        requestContext.execute("depositanteDialog.hide();");
    }

    public void oncapture(CaptureEvent captureEvent) {

        this.imagem = new Anexo();
        this.imagem.setNome("AVATAR");
        this.imagem.setNomeExibicao("AVATAR");
        this.imagem = arquivoUtilitario.adicionarArquivo(captureEvent);
        this.imagem.setUrl(this.imagem.getUrl().concat("thumbnail.").concat(this.imagem.getNome()).concat(".jpeg"));

    }
}
